Object and Arrays - Reference VS Copy


Posted by wayne201299 on 2023-09-28

JavaScript中傳值跟傳址的區別

在JavaCcript中,有分為純值(Primitive Types)跟物件Object兩種資料型別,除了Primitive Types外的資料型別都是物件(Object)

純值(Primitive Types)

Primitive Types的特性有

  • 不可變性(Immutability):純值是不可變的,這意味著一旦創建,它們的值不能被修改。任何修改純值的操作都會返回一個新的值,而不會改變原始值。這有助於避免在應用程序中不小心改變數據。
  • 按值比較(Value-Based Comparison):比較兩個純值時,實際比較的是它們的值。如果兩個純值的值相同,則它們被視為相等。
  • 可哈希性(Hashability):純值通常是可哈希的,這意味著它們可以用作對象的鍵(key)或存儲在集合中,如 JavaScript 中的 Set 或 Map。
  • 簡單數據類型(Simple Data Types):JavaScript 中的基本數據類型,包括數字(number)、字串(string)、布林(boolean)、undefined 和 null,都是純值。
  • 傳值(Pass-by-Value):當將純值傳遞給函數或從一個變數賦值給另一個變數時,實際上是將該值的複本傳遞給了目標。這意味著在函數內部修改該值不會影響到原始值。

型態

Primitive Types有以下幾種

  • Null
  • Undefined
  • Boolean
  • Number
  • String
  • Symbol(ES6後才有)

物件(Objects)

Objects都是pass by reference

當我們在傳值或賦值給另外一個Object時,其實傳遞的是物件的引用,也就是記憶體位址,所以當複製的物件被改動時,原始的物件也會一併被改動,因為他們都是指向同一個記憶體位址

複製的方法可以改成下面幾種方式,來避免修改到原始物件

  • 物件是Array

      team2 = players.slice();
      // or create a new array and concat the old one in
      team3 = [].concat(players);
      // or use the new ES6 Spread
      team4 = [...players];
    
  • 物件是Object,可以用Object.asign()或是淺拷貝()

      function createCopy(obj) {
        return Object.assign({}, obj); // 使用Object.assign()創建物件副本
      }
    
      let originalObject = { property: "value" };
      let copy = createCopy(originalObject);
    
      copy.property = "new value";
    
      console.log(originalObject.property); // "value"
      console.log(copy.property); // "new value"
    

注意淺拷貝只會複製第一層,我的這篇文章有稍微詳細的解釋

型態

常見的物件型態有

  • 物件(Objects):物件是一種複合資料型別,用於組織和存儲多個值。物件以鍵-值對的形式存儲數據,可以包含各種類型的數據,包括純值、函數和其他物件。

      let person = {
          name: "John",
          age: 30,
          isStudent: false,
          sayHello: function() {
              console.log("Hello!");
          }
      };
    
  • 數組(Arrays):數組是一種特殊的物件,用於按順序存儲多個值。數組的元素可以是任何資料型別,並使用索引訪問。

      let colors = ["red", "green", "blue"];
    
  • 函數(Functions):函數是一種特殊的物件,可以執行操作並返回值。函數在 JavaScript 中是一級公民,可以存儲在變數中、作為參數傳遞和作為返回值返回。

      function add(a, b) {
        return a + b;
      }
    
  • 日期(Date):Date 型別用於處理日期和時間。它允許創建日期對象,執行日期計算和格式化。

      let currentDate = new Date();
    
  • 正則表達式(Regular Expressions):正則表達式是用於搜索和匹配字符串模式的工具。它們以字面值或構造函數的方式創建。

      let regex = /pattern/;
    
  • Map 和 Set:Map 是一種鍵-值對的集合,而 Set 是一種唯一值的集合。它們提供了高效的數據存儲和查找方式。

      let myMap = new Map();
      myMap.set("name", "Alice");
    
      let mySet = new Set();
      mySet.add(1);
    

#javascript







Related Posts

原子習慣:法則 4 - 讓獎賞令人滿足

原子習慣:法則 4 - 讓獎賞令人滿足

老爸的私房錢

老爸的私房錢

金魚系列、 RWD (上)

金魚系列、 RWD (上)


Comments